package utils;

import java.awt.Color;

import javax.media.opengl.GL;

import lapiz.LapizXY;
import lapiz.LapizXZ;
import figuras.PuntoVector;

public class UtilPoligono {
	
	/**
	 * funcion que dibuja un poligono regular con un numero de lados, radio y centro dados
	 * en el plano XY
	 * @param centro centro del poligono
	 * @param radio radio del poligono
	 * @param nLados numero de lados del poligono
	 * @param gl
	 * @return vertices del poligono
	 */
	public static PuntoVector[] poligonoRegularXY(PuntoVector centro,double radio,
			int nLados, boolean pinta, GL gl, Color color){
	    double alfa = 2*Math.PI/(double)nLados;
	    double beta = (Math.PI - alfa)/ 2.0;
	    double gamma = Math.PI - 2*beta;
	    double teta = Math.PI - beta;
	    double lado = Math.cos(beta)*radio*2.0;
	    PuntoVector  p = new PuntoVector(centro.getX()+radio,0,centro.getZ(),1);
	    LapizXY l = new LapizXY(p,teta,gl);
	    return poligonoRegular1XY(l,lado,nLados,gamma, pinta, color);
	}

	private static PuntoVector[] poligonoRegular1XY(LapizXY l,double lado,int nLados, 
			double gamma, boolean pinta, Color color){
		PuntoVector[] vertices = new PuntoVector[nLados];
		
	    for(int i=0;i<nLados;i++){
	        l.avanza(lado,pinta,GL.GL_LINES,color);
	        PuntoVector aux=l.getPosicion();
	        vertices[i]=new PuntoVector(aux);
	        l.gira(gamma*360.0/(2.0*Math.PI));
	    }
	    
	    return vertices;
	}
	
	/**
	 * funcion que dibuja un poligono regular con un numero de lados, radio y centro dados
	 * en el plano XZ
	 * @param centro centro del poligono
	 * @param radio radio del poligono
	 * @param nLados numero de lados del poligono
	 * @param gl
	 * @return vertices del poligono
	 */
	public static PuntoVector[] poligonoRegularXZ(PuntoVector centro,double radio,
			int nLados, boolean pinta, GL gl){
	    double alfa = 2*Math.PI/(double)nLados;
	    double beta = (Math.PI - alfa)/ 2.0;
	    double gamma = Math.PI - 2*beta;
	    double teta = Math.PI - beta;
	    double lado = Math.cos(beta)*radio*2.0;
	    PuntoVector  p = new PuntoVector(centro.getX()+radio,0,centro.getZ(),1);
	    LapizXZ l = new LapizXZ(p,teta,gl);
	    return poligonoRegular1XZ(l,lado,nLados,gamma,pinta);
	}

	private static PuntoVector[] poligonoRegular1XZ(LapizXZ l,double lado,int nLados, 
			double gamma, boolean pinta){
		PuntoVector[] vertices = new PuntoVector[nLados];
		
	    for(int i=0;i<nLados;i++){
	        l.avanza(lado,pinta,GL.GL_LINES);
	        PuntoVector aux=l.getPosicion();
	        vertices[i]=new PuntoVector(aux);
	        l.gira(gamma*360.0/(2.0*Math.PI));
	    }
	    
	    return vertices;
	}
}
